package 中等.数学;

import java.util.HashSet;
import java.util.Set;

/**
 * 给定2D空间中四个点的坐标 p1, p2, p3 和 p4，如果这四个点构成一个正方形，则返回 true 。
 * 点的坐标 pi 表示为 [xi, yi] 。输入 不是 按任何顺序给出的。
 * 一个 有效的正方形 有四条等边和四个等角(90度角)。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/valid-square
 */
public class 有效的正方形_593 {

    public static void main(String[] args) {

        //  p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,1]
        System.out.println(validSquare(new int[]{0, 0}, new int[]{13, 0}, new int[]{5, 12}, new int[]{18, 12}));

    }

    /**
     * 求出正方形的四条边和两条对角线的长度
     * 四条边长度相等
     * 对角线长度相等
     * 注意: 可能存在两点相同的情况，需要判断是否有等于 0 长度的边
     */
    public static boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
        Set<Integer> set = new HashSet<>();
        set.add(getDistance(p1, p2));
        set.add(getDistance(p1, p3));
        set.add(getDistance(p1, p4));
        set.add(getDistance(p2, p3));
        set.add(getDistance(p2, p4));
        set.add(getDistance(p3, p4));
        return !set.contains(0) && set.size() == 2;
    }

    private static int getDistance(int[] arr1, int[] arr2) {
        int x = Math.abs(arr1[0] - arr2[0]);
        int y = Math.abs(arr1[1] - arr2[1]);
        return x * x + y * y;
    }

}
